<?php

/**
 * 夏日葵电商系统
 * http://www.xiarikui.com
 */
use Think\Model\RelationModel;

/**
 * 微信支付插件 逻辑定义
 * Class 
 * @package Home\Payment
 */
class weixin extends RelationModel {

    public $tableName = 'plugin'; // 插件表        
    public $alipay_config = array(); // 支付宝支付配置参数

    /**
     * 析构流函数
     */

    public function __construct() {
        parent::__construct();

        require_once("lib/WxPay.Api.php"); // 微信扫码支付demo 中的文件         
        require_once("example/WxPay.NativePay.php");
        require_once("example/WxPay.JsApiPay.php");

        $paymentPlugin = M('Plugin')->where("code='weixin' and  type = 'payment' ")->find(); // 找到微信支付插件的配置
        $config_value = unserialize($paymentPlugin['config_value']); // 配置反序列化        
        WxPayConfig::$appid = $config_value['appid']; // * APPID：绑定支付的APPID（必须配置，开户邮件中可查看）
        WxPayConfig::$mchid = $config_value['mchid']; // * MCHID：商户号（必须配置，开户邮件中可查看）
        WxPayConfig::$key = $config_value['key']; // KEY：商户支付密钥，参考开户邮件设置（必须配置，登录商户平台自行设置）
        WxPayConfig::$appsecret = $config_value['appsecret']; // 公众帐号secert（仅JSAPI支付的时候需要配置)，
    }

    /**
     * 生成支付代码
     * @param   array   $order      订单信息
     * @param   array   $config_value    支付方式信息
     */
    function get_code($order, $config_value='') {
        $notify_url = SITE_URL . '/index.php/xcx/payment/notify'; // 接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
        //$notify_url = C('site_url').U('Home/Payment/notifyUrl',array('pay_code'=>'weixin')); // 接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
        //$notify_url = C('site_url')."/index.php?m=Home&c=Payment&a=notifyUrl&pay_code=weixin";
        $input = new WxPayUnifiedOrder();
        $input->SetBody("财税答疑"); // 商品描述
        $input->SetAttach($order['attach']); // 附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
        $input->SetOut_trade_no($order['order_sn']); // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        $input->SetTotal_fee($order['order_amount'] * 100); // 订单总金额，单位为分，详见支付金额
        $input->SetNotify_url($notify_url); // 接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
        $input->SetTrade_type("APP"); // 交易类型   取值如下：JSAPI，NATIVE，APP，详细说明见参数规定    NATIVE--原生扫码支付
        $input->SetProduct_id($order['product_id']); // 商品ID trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。
        $wxpayapi = new WxPayApi();
        $result = $wxpayapi->unifiedOrder($input);
        return $result;
    }

    /**
     * 生成支付代码
     * @param   array   $order      订单信息
     * @param   array   $config_value    支付方式信息
     */
    function getCode($order, $config_value) {
        $notify_url = SITE_URL . '/index.php/Home/Payment/notifyUrl/pay_code/weixin'; // 接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
        //$notify_url = C('site_url').U('Home/Payment/notifyUrl',array('pay_code'=>'weixin')); // 接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
        //$notify_url = C('site_url')."/index.php?m=Home&c=Payment&a=notifyUrl&pay_code=weixin";
        $input = new WxPayUnifiedOrder();
        $input->SetBody("巴迪洗车"); // 商品描述
        $input->SetAttach("weixin"); // 附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
        $input->SetOut_trade_no($order['order_sn']); // 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        $input->SetTotal_fee($order['order_amount'] * 100); // 订单总金额，单位为分，详见支付金额
        $input->SetNotify_url($notify_url); // 接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
        $input->SetTrade_type("APP"); // 交易类型   取值如下：JSAPI，NATIVE，APP，详细说明见参数规定    NATIVE--原生扫码支付
        $input->SetProduct_id($order['id']); // 商品ID trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。
        $notify = new NativePay();
        $result = $notify->GetPayUrl($input); // 获取生成二维码的地址
        $url2 = $result["code_url"];
        return '<img alt="模式二扫码支付" src="/index.php?m=Home&c=Index&a=qrCode&data=' . urlencode($url2) . '" style="width:110px;height:110px;"/>';
    }

    /**
     * 服务器点对点响应操作给支付接口方调用
     * 
     */
    function response() {
        require_once("example/notify.php");
        $notify = new PayNotifyCallBack();
        $notify->Handle(false);
    }

    /**
     * 页面跳转响应操作给支付接口方调用
     */
    function respond2() {
        // 微信扫码支付这里没有页面返回
    }

    function getJSAPI($order, $is_vue = 0, $openid) {
        /*if (stripos($order['order_sn'], 'recharge') !== false) {
            $go_url = U('Mobile/User/points', array('type' => 'recharge'));
            $back_url = U('Mobile/User/recharge', array('order_id' => $order['order_id']));
        } else {
            $go_url = U('Mobile/User/orderDetail', array('id' => $order['order_id']));
            $back_url = U('Mobile/Cart/cart4', array('order_id' => $order['order_id']));
        }*/
        //①、获取用户openid
        $tools = new JsApiPay();
//        $openId = $tools->GetOpenid();
        $openId = $openid;//$_SESSION['openid'];
//        $openId = $openid;
        //②、统一下单
        //$order['order_amount'] = 0.01;
        $input = new WxPayUnifiedOrder();
        $input->SetBody("支付订单：" . $order['order_sn']);
        $input->SetAttach($order['attach']);
        $input->SetOut_trade_no($order['order_sn']);
        $input->SetTotal_fee($order['order_amount'] * 100);
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("xrk_wx_pay");
        $input->SetNotify_url(SITE_URL . '/index.php/xcx/payment/notify.html');
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order2 = WxPayApi::unifiedOrder($input);

        //echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
        //printf_info($order);exit;
        $jsApiParameters = $tools->GetJsApiParameters($order2);
        if ($is_vue > 0) {
            return $jsApiParameters;
        }
        $go_url = SITE_URL.U('xcx/payment/payment_after' );
        $back_url = SITE_URL.U('xcx/payment/payment_after');
        $html = <<<EOF
	<script type="text/javascript">
	//调用微信JS api 支付
	function jsApiCall()
	{
		WeixinJSBridge.invoke(
			'getBrandWCPayRequest',$jsApiParameters,
			function(res){
				//WeixinJSBridge.log(res.err_msg);
				 if(res.err_msg == "get_brand_wcpay_request:ok") {
				    //location.href='$go_url?sign=1';
				    alert('支付成功!');
				 }else{
				 	alert(res.err_code+res.err_desc+res.err_msg);
				    //location.href='$back_url?sign=0&msg='+res.err_code+','+res.err_desc+','+res.err_msg;
				 }
			}
		);
	}

	function callpay()
	{
		if (typeof WeixinJSBridge == "undefined"){
		    if( document.addEventListener ){
		        document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
		    }else if (document.attachEvent){
		        document.attachEvent('WeixinJSBridgeReady', jsApiCall);
		        document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
		    }
		}else{
		    jsApiCall();
		}
	}
	callpay();
	</script>
EOF;

        return $html;
    }



    /**
     * 支付通知
     */
    public function notify() {
        header('Content-Type:text/xml; charset=utf-8');
        require_once("example/notify.php");
        $notify = new PayNotifyCallBack();
        $notify->Handle(false);


        /*$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
        $result = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        if ($result['return_code'] == 'SUCCESS') {
            $shop_sn = $result['out_trade_no'];
            $trade_sn = $result['transaction_id'];
            $money = $result['total_fee'] / 100;
            $pay_time = chunk_split($result['time_end'],2,"|");
            $pay_time = explode('|',$pay_time);
            $pay_time = $pay_time[0].$pay_time[1].' '.$pay_time[2].':'.$pay_time[3].':'.$pay_time[4];


            $xml = array('return_code' => 'SUCCESS', 'return_msg' => 'OK');
        }else{
            $xml = array('return_code' => 'FAIL', 'return_msg' => 'fail');
        }


        exit(arrayToXml($xml));*/
    }

}
